#ifndef __SE_TCPCONNECTION_HPP__
#define __SE_TCPCONNECTION_HPP__

#include "Socket.hpp"
#include "SocketAddress.hpp"
#include "SocketIO.hpp"
#include "EventHandler.hpp"
#include <string>

namespace se {

class TcpConnection : public std::enable_shared_from_this<TcpConnection> {
public:
    TcpConnection(int clientFileDiscriptor);

    /**
     * @brief 接收输入
     * 
     * @return std::string 
     */
    std::string receive();

    /**
     * @brief 发送数据
     * 
     * @param message 
     * @return int 
     */
    int send(const std::string &message);

    /**
     * @brief 将对象转换成字符串形式
     * 
     * @return std::string 
     */
    std::string toString() const;

    /**
     * @brief 获取TCP连接对应的文件描述符
     * 
     * @return int 
     */
    int getFileDescriptor() const;
private:
    /**
     * @brief 获取本地套接口地址
     * 
     * @return SocketAddress 
     */
    SocketAddress getLocalAddress() const;

    /**
     * @brief 获取远端套接口地址
     * 
     * @return SocketAddress 
     */
    SocketAddress getRemoteAddress() const;

public:
    /** 当TCP连接建立时的事件处理函数 */
    EventHandler<void (std::shared_ptr<TcpConnection>)> OnConnected;

    /** 当TCP连接接收到数据时的事件处理函数 */
    EventHandler<void (std::shared_ptr<TcpConnection>)> OnMessageReceived;

    /** 当TCP连接断开连接时的事件处理函数 */
    EventHandler<void (std::shared_ptr<TcpConnection>)> OnClosed;

private:
    Socket _socket;  // 套接口
    SocketIO _socketIO;  // 套接口输入输出

};

}  // namespace se

#endif